// 1、正确搭建一个ts环境并成功启动
// 2、创建一个枚举类型 Color，包含三个值：Red、Green、Blue。
enum Color {
  Red,
  Green,
  Blue,
}

// 创建一个名为 Shape 的抽象类，它有一个名为 name 的属性和一个抽象方法 calculateArea，用于计算图形的面积。

abstract class Shape {
  abstract name: string;
  abstract calculateArea(): number;
}

// 4、创建一个名为 Rectangle 的类，它继承自 Shape 类。
class Rectangle extends Shape {
  // 5、Rectangle 类有两个属性：width 和 height，它们都是数字类型。
  name: string = "Rectangle";
  width: number;
  height: number;
  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }
  // 6、实现 Rectangle 类中的 calculateArea 方法，计算矩形的面积并返回结果。
  calculateArea() {
    return this.width * this.height;
  }
}

// 7、创建一个名为 Circle 的类，它继承自 Shape 类。
class Circle extends Shape {
  // 8、Circle 类有一个属性 radius，它是一个数字类型。
  radius: number;
  name: string = "Circle";
  constructor(radius: number) {
    super();
    this.radius = radius;
  }
  // 9、实现 Circle 类中的 calculateArea 方法，计算圆的面积并返回结果。
  calculateArea() {
    return this.radius * this.radius * Math.PI;
  }
}

// 10、创建一个名为 ShapeFactory 的类，它有一个静态方法 createShape，根据传入的参数 type 创建不同的图形对象。
class ShapeFactory {
  static createShape(
    type: "Rectangle" | "Circle",
    width: number,
    height?: number
  ) {
    // 11、如果传入的 type 为 Rectangle，则调用 Rectangle 类的构造函数创建一个矩形对象，并返回该对象。
    // 12、如果传入的 type 为 Circle，则调用 Circle 类的构造函数创建一个圆对象，并返回该对象。

    if (type === "Rectangle" && height) {
      return new Rectangle(width, height);
    } else {
      return new Circle(width)
    }
    
  }
}

// 13、创建一个名为 shape1 的变量，使用 ShapeFactory.createShape 方法创建一个矩形对象，宽度为 5，高度为 10。
const shape1 = ShapeFactory.createShape("Rectangle", 5, 10);
// 14、创建一个名为 shape2 的变量，使用 ShapeFactory.createShape 方法创建一个圆对象，半径为 7。
const shape2 = ShapeFactory.createShape("Circle", 7);

// 15、调用 shape1 的 calculateArea 方法，确保输出矩形的面积。
// 16 调用 shape2 的 calculateArea 方法，确保输出圆的面积。
console.log(shape1.calculateArea())
console.log(shape2.calculateArea())


export {};